#!/bin/bash

# 定义变量
URL_1="http://10.255.18.8:8983/solr/biblio/admin/"
URL_2="http://localhost:81" 
URL_3="http://localhost:8999"
PORT=8983
RESTART_SCRIPT="/home/apache-solr-3.5.0/example/start_solr.sh"
RESTART_SCRIPT_81="/home/opac81/startup.sh"
RESTART_SCRIPT_8999="/home/opac8999/startup.sh"
LOG_FILE="/var/log/solr_monitor.log"
MAX_LOG_SIZE=10485760  # 10MB
CURL_TIMEOUT=30        # 超时时间(秒)
RESTART_VERIFY_WAIT=60 # 重启后验证等待时间(秒)

# 记录日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# 日志轮转函数
rotate_log() {
    if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE") -gt $MAX_LOG_SIZE ]; then
        mv "$LOG_FILE" "${LOG_FILE}.$(date '+%Y%m%d%H%M%S')"
        touch "$LOG_FILE"
        log "日志文件已轮转"
    fi
}

# 检查服务状态函数
check_service() {
    log "开始检查Solr服务状态..."

    # 获取端口8983的HTTP状态码
    HTTP_STATUS_1=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout $CURL_TIMEOUT --max-time $CURL_TIMEOUT "$URL_1" || echo "000")
    # 获取端口81的HTTP状态码
    HTTP_STATUS_2=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout $CURL_TIMEOUT --max-time $CURL_TIMEOUT "$URL_2" || echo "000")
    # 获取端口8999的HTTP状态码
    HTTP_STATUS_3=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout $CURL_TIMEOUT --max-time $CURL_TIMEOUT "$URL_3" || echo "000")
    
    log "端口8983状态码: $HTTP_STATUS_1, 端口81状态码: $HTTP_STATUS_2, 端口8999状态码: $HTTP_STATUS_3"
    
    if [ "$HTTP_STATUS_1" != "200" ] || [ "$HTTP_STATUS_2" != "200" ] || [ "$HTTP_STATUS_3" != "200" ]; then
        log "警告: 端口 8983、81 或 8999 没有返回 HTTP 200 状态码，执行重启脚本"
        restart_service
        return 1
    else
        log "所有服务正常，HTTP 状态码均为 200"
        return 0
    fi
}

# 重启服务函数
restart_service() {
    # 查找并杀死占用端口的进程
    if command -v lsof &> /dev/null; then
        PID=$(lsof -ti :$PORT 2>/dev/null)
        if [ -n "$PID" ]; then
            log "杀死进程 PID: $PID (端口 $PORT)"
            kill -9 $PID
            sleep 2
        else
            log "没有找到占用端口 $PORT 的进程"
        fi
    fi
    
    # 检查重启脚本是否存在并执行
    if [ -f "$RESTART_SCRIPT" ]; then
        log "开始执行重启脚本: $RESTART_SCRIPT"
        bash "$RESTART_SCRIPT" &
        log "重启脚本执行完成"
        sleep 30
        log "开始执行重启脚本: $RESTART_SCRIPT_81"
        bash "$RESTART_SCRIPT_81" &
        log "重启脚本执行完成"
        sleep 90
        log "开始执行重启脚本: $RESTART_SCRIPT_8999"
        bash "$RESTART_SCRIPT_8999" &
        log "重启脚本执行完成"
        sleep 120
        return 0
    else
        log "错误: 所有重启脚本都不存在"
        return 1
    fi
}

# 验证重启是否成功
verify_restart() {
    log "等待 $RESTART_VERIFY_WAIT 秒后验证服务..."
    sleep $RESTART_VERIFY_WAIT
    
    if check_service; then
        log "服务重启成功"
        return 0
    else
        log "警告: 服务重启后仍然无法访问"
        return 1
    fi
}

# 发送邮件通知（如果需要）
send_notification() {
    local subject="$1"
    local message="$2"
    
    # 取消注释并配置邮件发送命令
    # echo "$message" | mail -s "$subject" admin@example.com
    log "通知已发送: $subject"
}

# 主程序
main() {
    # 检查依赖
    if ! command -v curl &> /dev/null; then
        log "错误: curl 未安装，请安装后再运行此脚本"
        exit 1
    fi
    
    if ! command -v lsof &> /dev/null; then
        log "警告: lsof 未安装，可能无法正确识别进程"
    fi
    
    # 日志轮转
    rotate_log
    
    # 检查服务
    if ! check_service; then
        log "准备重启服务..."
        
        if restart_service; then
            verify_restart
            # 如果需要邮件通知，取消下面的注释
            # send_notification "Solr服务已重启" "Solr服务在$(date)被自动重启"
        else
            log "错误: 服务重启失败"
            # send_notification "Solr服务重启失败" "请手动检查服务状态"
        fi
    fi
    
    log "检查完成"
}

# 执行主程序
main